package contratosonline.ejb.controller;


import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;

import contratosonline.entity.Contrato;
import contratosonline.entity.TermoAditivo;

/**
 *
 * @author admin
 */
@Stateless
public class TermoAditivoJPAController implements TermoAditivoJPAControllerLocal{
	@PersistenceContext
	private EntityManager em;

	public EntityManager getEntityManager() {
		return em;
	}

	public TermoAditivoJPAController(){
		
	}
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoControllerLocal#persiste(contratosonline.entity.TermoAditivo)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoJPAControllerLocal#persiste(contratosonline.entity.TermoAditivo)
	 */
    public void persiste(TermoAditivo termoaditivo) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Contrato contrato = termoaditivo.getContrato();
            if (contrato != null) {
                contrato = em.getReference(contrato.getClass(), contrato.getIdcontrato());
                termoaditivo.setContrato(contrato);
            }
            em.persist(termoaditivo);
            if (contrato != null) {
                contrato.getTermoaditivoCollection().add(termoaditivo);
                contrato = em.merge(contrato);
            }
        } finally {
            if (em != null) {
               // em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoControllerLocal#altera(contratosonline.entity.TermoAditivo)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoJPAControllerLocal#altera(contratosonline.entity.TermoAditivo)
	 */
    public void altera(TermoAditivo termoaditivo) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            TermoAditivo persistentTermoaditivo = em.find(TermoAditivo.class, termoaditivo.getIdTermoAditivo());
            Contrato contratoOld = persistentTermoaditivo.getContrato();
            Contrato contratoNew = termoaditivo.getContrato();
            if (contratoNew != null) {
                contratoNew = em.getReference(contratoNew.getClass(), contratoNew.getIdcontrato());
                termoaditivo.setContrato(contratoNew);
            }
            termoaditivo = em.merge(termoaditivo);
            if (contratoOld != null && !contratoOld.equals(contratoNew)) {
                contratoOld.getTermoaditivoCollection().remove(termoaditivo);
                contratoOld = em.merge(contratoOld);
            }
            if (contratoNew != null && !contratoNew.equals(contratoOld)) {
                contratoNew.getTermoaditivoCollection().add(termoaditivo);
                contratoNew = em.merge(contratoNew);
            }
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = termoaditivo.getIdTermoAditivo();
                if (findTermoaditivo(id) == null) {
                    throw new Exception("The termoaditivo with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
             //   em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoControllerLocal#exclui(java.lang.Integer)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoJPAControllerLocal#exclui(java.lang.Integer)
	 */
    public void exclui(Integer id) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            TermoAditivo termoaditivo;
            try {
                termoaditivo = em.getReference(TermoAditivo.class, id);
                termoaditivo.getIdTermoAditivo();
            } catch (EntityNotFoundException enfe) {
                throw new Exception("The termoaditivo with id " + id + " no longer exists.", enfe);
            }
            Contrato contrato = termoaditivo.getContrato();
            if (contrato != null) {
                contrato.getTermoaditivoCollection().remove(termoaditivo);
                contrato = em.merge(contrato);
            }
            em.remove(termoaditivo);
        } finally {
            if (em != null) {
                //em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoControllerLocal#findTermoaditivoEntities()
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoJPAControllerLocal#findTermoaditivoEntities()
	 */
    public List<TermoAditivo> findTermoaditivoEntities() {
        return findTermoaditivoEntities(true, -1, -1);
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoControllerLocal#findTermoaditivoEntities(int, int)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoJPAControllerLocal#findTermoaditivoEntities(int, int)
	 */
    public List<TermoAditivo> findTermoaditivoEntities(int maxResults, int firstResult) {
        return findTermoaditivoEntities(false, maxResults, firstResult);
    }

    @SuppressWarnings("unchecked")
	private List<TermoAditivo> findTermoaditivoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Termoaditivo as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoControllerLocal#findTermoaditivo(java.lang.Integer)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoJPAControllerLocal#findTermoaditivo(java.lang.Integer)
	 */
    public TermoAditivo findTermoaditivo(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(TermoAditivo.class, id);
        } finally {
         //   em.close();
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoControllerLocal#getTermoaditivoCount()
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.TermoAditivoJPAControllerLocal#getTermoaditivoCount()
	 */
    public int getTermoaditivoCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Termoaditivo as o").getSingleResult()).intValue();
        } finally {
            //em.close();
        }
    }
    
    @SuppressWarnings("unchecked")
	public TermoAditivo findTermoaditivoByContrato(Integer idTermo,Integer idContrato) {
        EntityManager em = getEntityManager();
        try {
        	Query query = em.createNamedQuery("Termoaditivo.findByNumeroTermo");
        	query.setParameter("numeroTermo", idTermo);
            List<TermoAditivo> listaTermos = query.getResultList();
            for (TermoAditivo t : listaTermos) {
				if (t.getContrato()!=null&&t.getContrato().getIdcontrato().equals(idContrato)) {
					return t;
				}
			}
            return null;
        } finally {
            //em.close();
        }
    }
    
    @SuppressWarnings("unchecked")
	public List<TermoAditivo> findTermoaditivoByContrato(Integer idContrato) {
        EntityManager em = getEntityManager();
        try {
        	Query query = em.createNamedQuery("Contrato.findByIdcontrato");
        	query.setParameter("idcontrato", idContrato);
            List<Contrato> listaContratos = query.getResultList();
            Contrato contratoEncontrado;
            if (listaContratos!=null&&!listaContratos.isEmpty()) {
				contratoEncontrado = listaContratos.get(0);
				if (contratoEncontrado!=null) {
					Collection<TermoAditivo> collectionTemos = contratoEncontrado.getTermoaditivoCollection();
					List<TermoAditivo> listaTermo = new ArrayList<TermoAditivo>();
					for (TermoAditivo termoAditivo : collectionTemos) {
						listaTermo.add(termoAditivo);
					}
					return 	listaTermo;
				}
			}
 
            return null;
        } finally {
            //em.close();
        }
    }

}

